{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# OpenAI 适配器\n",
    "\n",
    "对于部分已经适配 OpenAI 而尚未支持千帆 SDK 的第三库，本文提供了一种方法，可以快速将千帆适配至任意这类库。\n",
    "\n",
    "千帆 SDK CLI 支持启动一个将千帆模拟成 OpenAI 接口的服务，然后让 OpenAI 请求该服务即可完成千帆的接入。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "具体来说，首先需要在命令行中运行 `qianfan openai` 启动一个模拟服务。\n",
    "\n",
    "可以通过 `-p 8001` 来指定端口，以及 `-d` 来让服务保持在后台运行。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以下是使用python代码启动子进程的方式运行："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# import nest_asyncio\n",
    "import os\n",
    "import subprocess as sp\n",
    "\n",
    "# 以下环境变量供千帆 OpenAI Adapter：\n",
    "# 使用安全认证的access_key/secret_key:\n",
    "os.environ[\"QIANFAN_ACCESS_KEY\"] = \"your_access_key\"\n",
    "os.environ[\"QIANFAN_SECRET_KEY\"] = \"your_secret_key\"\n",
    "# 或者应用ak/sk\n",
    "# os.environ[\"QIANFAN_AK\"]=\"your_app_ak\"\n",
    "# os.environ[\"QIANFAN_SK\"]=\"your_app_sk\"\n",
    "\n",
    "# 启动千帆 SDK 的 OpenAI Adapter 服务，用于代理转发指向 OpenAI 的请求，并替换为千帆服务的返回\n",
    "server = sp.Popen(\"qianfan openai -p 8001\", shell=True)\n",
    "# 也可以在终端直接执行qianfan openai -p 8001"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "当服务启动后，只需要设置两个环境变量，就可以在代码中直接调用支持 OpenAI 的第三方库，这里以 langchain 为例："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "\n",
    "os.environ[\"OPENAI_API_KEY\"] = \"any-content\"  # 任意内容，仅为绕过 OpenAI SDK 验证\n",
    "os.environ[\"OPENAI_BASE_URL\"] = \"http://127.0.0.1:8001/v1\"  # 修改为本地 OpenAI API 地址"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'你好，我是百度研发的文心一言。我可以回答你的问题或与你对话。请问你有什么具体的问题或需要帮助吗？'"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from langchain_openai import OpenAI\n",
    "from langchain_core.messages import HumanMessage, SystemMessage\n",
    "\n",
    "llm = OpenAI()\n",
    "\n",
    "llm.invoke([\n",
    "    HumanMessage(\n",
    "        content=\"你是谁\"\n",
    "    ),\n",
    "])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "也支持使用 function_call 实现 Agent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "from langchain import hub\n",
    "from langchain.agents import AgentExecutor, create_openai_tools_agent\n",
    "from langchain_openai import ChatOpenAI\n",
    "from langchain_community.tools import DuckDuckGoSearchRun"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "tools = [DuckDuckGoSearchRun()]\n",
    "prompt = hub.pull(\"hwchase17/openai-tools-agent\")\n",
    "llm = ChatOpenAI(model=\"gpt-3.5-turbo-1106\", temperature=0)\n",
    "\n",
    "# Construct the OpenAI Tools agent\n",
    "agent = create_openai_tools_agent(llm, tools, prompt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "\n",
      "\u001b[1m> Entering new AgentExecutor chain...\u001b[0m\n",
      "\u001b[32;1m\u001b[1;3m\n",
      "Invoking: `duckduckgo_search` with `{'query': '文心千帆'}`\n",
      "\n",
      "\n",
      "\u001b[0m\u001b[36;1m\u001b[1;3m文心千帆是由百度推出的一款AI工具，它集合了PPT制作、数字人主播一键开播等数十种应用场景，致力于帮助用户提升数字内容创作效率。 文心千帆采用了先进的AI技术，可以根据用户需求自动生成高质量的PPT、 视频 等内容，让创作变得更加轻松和高效。 据介绍，「文心一言」目前包含以下五类落地场景：文学创作、商业文案创作、数理逻辑推送、中文理解、多模态生成。 文心一言是百度基于文心大模型技术推出的生成式对话产品。 什么是千帆大模型平台？ 百度智能云千帆大模型平台（以下简称千帆或千帆大模型平台）是面向企业开发者的一站式大模型开发及服务运行平台。 千帆不仅提供了包括文心一言底层模型（ERNIE-Bot）和第三方开源大模型，还提供了各种AI开发工具和整套开发环境，方便客户轻松使用和开发大模型应用。 支持数据管理、自动化模型SFT以及推理服务云端部署的一站式大模型定制服务，助力各行业的生成式AI应用需求落地。 高性能：百度文心千帆 大模型平台采用了先进的深度学习框架和高效的计算资源，确保模型推理的速度和准确性。 三、使用体验 在使用百度文心千帆大模型平台的过程中，我主要体验了文本分类和情感分析两个功能。下面我将通过实例来展示这 ... 什么是百度智能云千帆大模型平台. 更新时间 ： 2024-03-08. 目录. 视频介绍. 产品定义. 应用场景. 上线啦!. 与广大开发者共同探索大模型世界的无限可能! 关于应用程序如何备案， 点击进入 来看看吧～. 文心千帆在开发过程中充分运用了RLHF技术，通过收集用户的反馈数据来优化模型的表现。这种技术使得模型能够不断学习和改进，以提供更加符合用户需求的服务。 四、实际应用与建议 文心千帆的PPT制作和数字人直播功能在实际应用中取得了显著的效果。\u001b[0m\u001b[32;1m\u001b[1;3m文心千帆是由百度推出的一款AI工具，它集合了PPT制作、数字人主播一键开播等数十种应用场景，致力于帮助用户提升数字内容创作效率。文心千帆采用了先进的AI技术，可以根据用户需求自动生成高质量的PPT、视频等内容，让创作变得更加轻松和高效。同时，文心千帆还提供了包括文心一言底层模型（ERNIE-Bot）和第三方开源大模型在内的各种AI开发工具和整套开发环境，方便客户轻松使用和开发大模型应用。文心千帆在开发过程中充分运用了RLHF技术，通过收集用户的反馈数据来优化模型的表现，使得模型能够不断学习和改进，以提供更加符合用户需求的服务。\u001b[0m\n",
      "\n",
      "\u001b[1m> Finished chain.\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'input': '请通过搜索告诉我文心千帆是什么',\n",
       " 'output': '文心千帆是由百度推出的一款AI工具，它集合了PPT制作、数字人主播一键开播等数十种应用场景，致力于帮助用户提升数字内容创作效率。文心千帆采用了先进的AI技术，可以根据用户需求自动生成高质量的PPT、视频等内容，让创作变得更加轻松和高效。同时，文心千帆还提供了包括文心一言底层模型（ERNIE-Bot）和第三方开源大模型在内的各种AI开发工具和整套开发环境，方便客户轻松使用和开发大模型应用。文心千帆在开发过程中充分运用了RLHF技术，通过收集用户的反馈数据来优化模型的表现，使得模型能够不断学习和改进，以提供更加符合用户需求的服务。'}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)\n",
    "\n",
    "agent_executor.invoke({\"input\": \"请通过搜索告诉我文心千帆是什么\"})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "py311",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
